package com.icoolkj.learn.juc.base.communication;

import com.icoolkj.learn.juc.base.utils.SleepTools;
import lombok.extern.slf4j.Slf4j;

/**
 * @author icoolkj
 * @version 1.0
 * @description volatile
 * java 线程之间的通信由JAVA内存模型（JAVA Memory Model 简称JMM）
 * 线程对共享变量的所有操作都必须在自己的本地内存中进行，不能直接从主内存中读取。
 * @createDate 2025/03/05 11:45
 */
@Slf4j
public class VolatileDemo {

    // 主内存，共享变量
    // volatile 内存屏障，让线程本地内存无效，必须从主内存读取
    private static volatile boolean flag = false;

    public static void main(String[] args) {
        Thread t1 = new Thread(() ->{
            log.info("{} 开始执行...", Thread.currentThread().getName());
            int i = 0;
            while(!flag){
                i++;
                //Thread.yield(); //上下文切换，也会从主内存读取，同样也可能读取主内存最新值
            }
            log.info("{} 跳出循环...", Thread.currentThread().getName());
        }, "t1");

        t1.start();

        SleepTools.second(1);
        flag = true;
        log.info("主线程修改 flag={}", flag);

    }

}
